/*!
 * \file WTSHotItem.hpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 主力合约切换数据项定义文件
 */
#pragma once
#include "WTSObject.hpp"

NS_WTP_BEGIN

/*!
 * \brief 主力合约切换数据项类，用于管理期货主力合约的切换信息
 * 
 * \details 该类封装了期货品种主力合约切换时的详细信息，包括：
 *          - 交易所和品种信息：交易所代码、品种代码等
 *          - 合约切换信息：切换前后的合约代码
 *          - 切换时间数据：主力合约切换的具体日期
 *          - 价格调整数据：切换前后的收盘价格
 *          主要用于主力合约数据的连续性处理和历史数据的完整性维护
 * 
 * \author Wesley
 * \date 2020/03/30
 */
class WTSHotItem : public WTSObject
{
protected:
	/*!
	 * \brief 默认构造函数
	 * 
	 * \details 初始化主力合约切换数据项的基本状态
	 */
	WTSHotItem(){}
	
	/*!
	 * \brief 虚析构函数
	 * 
	 * \details 确保派生类能够正确析构，释放相关资源
	 */
	virtual ~WTSHotItem(){}

public:
	/*!
	 * \brief 创建主力合约切换数据项的静态工厂方法
	 * 
	 * \details 根据指定参数创建一个完整的主力合约切换记录，
	 *          包含切换的时间、合约信息和价格调整数据
	 * 
	 * \param exchg 交易所代码（如SHFE、DCE、CZCE等）
	 * \param product 品种代码（如cu、rb、i等）
	 * \param from 切换前的合约代码（如cu2012）
	 * \param to 切换后的合约代码（如cu2101）
	 * \param dt 切换日期，格式为YYYYMMDD的整数
	 * \param oldclose 切换前合约的最后收盘价，默认为0
	 * \param newclose 切换后合约的首日收盘价，默认为0
	 * 
	 * \return 创建成功的主力合约切换数据项对象指针
	 * 
	 * \note 返回的对象需要调用者负责内存管理
	 */
	static WTSHotItem* create(const char* exchg, const char* product, const char* from, const char* to, uint32_t dt, double oldclose = 0, double newclose = 0)
	{
		WTSHotItem* pRet = new WTSHotItem();
		pRet->_exchg = exchg;
		pRet->_product = product;
		pRet->_hot = pRet->_product + "0001";
		pRet->_from = from;
		pRet->_to = to;
		pRet->_dt = dt;
		pRet->_oldclose = oldclose;
		pRet->_newclose = newclose;
		return pRet;
	}

	/*!
	 * \brief 获取交易所代码
	 * 
	 * \details 返回主力合约所在的交易所代码，用于合约的唯一标识
	 * 
	 * \return 交易所代码字符串，如"SHFE"、"DCE"、"CZCE"等
	 */
	const char*		exchg() const{return _exchg.c_str();}
	
	/*!
	 * \brief 获取品种代码
	 * 
	 * \details 返回期货品种的标准代码，用于品种识别
	 * 
	 * \return 品种代码字符串，如"cu"、"rb"、"i"等
	 */
	const char*		product() const{return _product.c_str();}
	
	/*!
	 * \brief 获取主力合约代码
	 * 
	 * \details 返回标准化的主力合约代码，通常为品种代码+"0001"
	 * 
	 * \return 主力合约代码字符串，如"cu0001"、"rb0001"等
	 */
	const char*		hot() const{return _hot.c_str();}
	
	/*!
	 * \brief 获取切换前的合约代码
	 * 
	 * \details 返回主力合约切换前的具体月份合约代码
	 * 
	 * \return 切换前合约代码字符串，如"cu2012"
	 */
	const char*		from() const{return _from.c_str();}
	
	/*!
	 * \brief 获取切换后的合约代码
	 * 
	 * \details 返回主力合约切换后的新具体月份合约代码
	 * 
	 * \return 切换后合约代码字符串，如"cu2101"
	 */
	const char*		to() const{return _to.c_str();}
	
	/*!
	 * \brief 获取主力合约切换日期
	 * 
	 * \details 返回主力合约发生切换的具体日期
	 * 
	 * \return 切换日期，格式为YYYYMMDD的无符号整数，如20201215
	 */
	uint32_t		switchdate() const{return _dt;}

private:
	std::string		_exchg;		//交易所代码
	std::string		_product;	//品种代码
	std::string		_hot;		//主力合约代码
	std::string		_from;		//切换前合约代码
	std::string		_to;		//切换后合约代码
	uint32_t		_dt;		//切换日期
	double		_oldclose;		//切换前收盘价
	double		_newclose;		//切换后收盘价
};
NS_WTP_END
